//Automovel.java
// Classe de controle do automóvel
package controle;

import dao.DAOFactory;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.List;
import javax.swing.JOptionPane;
import visao.AutomovelTableModel;
import visao.Consulta;

/**
 * @author Diego Heusser
 * @author Eder Schramm
 */
public class Automovel {

    private visao.CadastroAutomovel cadAutomovel;
    private final visao.Menu menu;
    private visao.Consulta consulta;
    private final dao.AutomovelDAO daoAutomovel;
    private final dao.MotoristaDAO daoMotorista;
    private boolean alterar;

    public Automovel(visao.Menu menu) {
        this.menu = menu;
        dao.DAOFactory factory = dao.DAOFactory.getDAOFactory();
        daoAutomovel = factory.getAutomovelDAO();
        daoMotorista = factory.getMotoristaDAO();
        alterar = false;
    }

    public void cadastrar() {
        cadAutomovel = new visao.CadastroAutomovel();
        ouvintesCad();
        preencheCombo();
        cadAutomovel.setVisible(true);
    }

    public void consultar() {
        consulta = new Consulta(menu, true);
        atualizaTabela(daoAutomovel.listar());
        ouvintesCon();
        consulta.setVisible(true);
    }
    
    public boolean apagarDados() {
        dao.DAOFactory factory = dao.DAOFactory.getDAOFactory();
        return factory.getAutomovelDAO().apagarDados();
    }
    
    public void criarTabela() throws Exception {
        daoAutomovel.criarTabela();
    }

    private void ouvintesCon() {
        consulta.btCancelar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cancelarBusca();
            }
        });
        consulta.btEditar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                editar();
            }
        });
        consulta.btPesquisar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pesquisar();
            }
        });
        consulta.btRemover.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                remover();
            }
        });
        consulta.btListarFisico.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    atualizaTabela(daoAutomovel.listarFisico());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(consulta, ex.getMessage(),
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }

    private void editar() {
        int linha = consulta.tabela.getSelectedRow();
        if (linha != -1) {
            alterar = true;
            menu.setVisible(false);
            consulta.setVisible(false);
            cadastrar();
            cadAutomovel.tfID.setText(String.valueOf(consulta.tabela.getValueAt(linha, 0)));
            cadAutomovel.cbMotorista.setSelectedItem(
                    (modelo.Motorista) consulta.tabela.getValueAt(linha, 1));
            cadAutomovel.ftAno.setText(String.valueOf(consulta.tabela.getValueAt(linha, 2)));
            cadAutomovel.tfCor.setText(String.valueOf(consulta.tabela.getValueAt(linha, 3)).replaceAll(" ", ""));
            cadAutomovel.tfCombustivel.setText(String.valueOf(consulta.tabela.getValueAt(linha, 4)).replaceAll(" ", ""));
            cadAutomovel.tfFabricante.setText(String.valueOf(consulta.tabela.getValueAt(linha, 5)).replaceAll(" ", ""));
            cadAutomovel.tfModelo.setText(String.valueOf(consulta.tabela.getValueAt(linha, 6)).replaceAll(" ", ""));
        } else {
            JOptionPane.showMessageDialog(consulta, "selecione uma linha!");
        }
    }

    private void pesquisar() {
        atualizaTabela(daoAutomovel.listar(consulta.tfPesquisa.getText()));
    }

    private void remover() {
        int[] linhas = consulta.tabela.getSelectedRows();
        if (linhas.length > 0) {
            for (int i = 0; i < linhas.length; i++) {
                int id = (int) consulta.tabela.getValueAt(linhas[i], 0);
                daoAutomovel.remover(id);
            }
            atualizaTabela(daoAutomovel.listar());
        } else {
            JOptionPane.showMessageDialog(consulta, "Selecione uma Linha!");
        }
    }

    private void cancelarBusca() {
        consulta.tfPesquisa.setText(null);
        atualizaTabela(daoAutomovel.listar());
    }

    private void atualizaTabela(List<modelo.Automovel> lista) {
        AutomovelTableModel modelo = new AutomovelTableModel(lista);
        consulta.tabela.setModel(modelo);
    }

    private void alterar() {
        modelo.Automovel umAutomovel = new modelo.Automovel();
        umAutomovel.setAno(Integer.parseInt(cadAutomovel.ftAno.getText()));
        umAutomovel.setCombustivel(cadAutomovel.tfCombustivel.getText());
        umAutomovel.setCor(cadAutomovel.tfCor.getText());
        umAutomovel.setFabricante(cadAutomovel.tfFabricante.getText());
        umAutomovel.setId(Integer.parseInt(cadAutomovel.tfID.getText()));
        umAutomovel.setModelo(cadAutomovel.tfModelo.getText());
        umAutomovel.setUmMotorista((modelo.Motorista) cadAutomovel.cbMotorista.getSelectedItem());
        if (cadAutomovel.tfID.getForeground().equals(Color.black)) {
            if (umAutomovel.getUmMotorista() == null) {
                JOptionPane.showMessageDialog(cadAutomovel, "Selecione um motorista!");
                cadAutomovel.cbMotorista.requestFocus();
            } else {
                if (daoAutomovel.alterar(umAutomovel)) {
                    JOptionPane.showMessageDialog(cadAutomovel, "Alterado!");
                } else {
                    JOptionPane.showMessageDialog(cadAutomovel, "Não foi possível alterar!",
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
                limparTela();
                alterar = false;
            }
        } else {
            JOptionPane.showMessageDialog(cadAutomovel, "O campo 'ID' é inválido!");
            cadAutomovel.tfID.requestFocus();
        }
    }

    private void ouvintesCad() {
        cadAutomovel.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                controle.Menu controlador = new controle.Menu();
                controlador.executar();
                cadAutomovel.setVisible(false);
            }
        });
        cadAutomovel.btSalvar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (alterar) {
                    alterar();
                } else {
                    salvar();
                }
            }
        });
        cadAutomovel.btCancelar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                limparTela();
            }
        });
        cadAutomovel.tfID.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
                verificaId();
            }
        });

    }

    private void verificaId() {
        if (alterar) {
            if (!cadAutomovel.tfID.getText().equals("")) {
                if (daoAutomovel.idValido(
                        Integer.parseInt(cadAutomovel.tfID.getText()))) {
                    cadAutomovel.tfID.setForeground(Color.red);
                } else {
                    cadAutomovel.tfID.setForeground(Color.black);
                }
            }
        } else {
            if (!cadAutomovel.tfID.getText().equals("")) {
                if (daoAutomovel.idValido(
                        Integer.parseInt(cadAutomovel.tfID.getText()))) {
                    cadAutomovel.tfID.setForeground(Color.black);
                } else {
                    cadAutomovel.tfID.setForeground(Color.red);
                }
            }
        }
    }

    private void preencheCombo() {
        List<modelo.Motorista> lista = daoMotorista.listar();

        for (modelo.Motorista umMotorista : lista) {
            cadAutomovel.cbMotorista.addItem(umMotorista);
        }
    }

    private void limparTela() {
        cadAutomovel.cbMotorista.setSelectedIndex(-1);
        cadAutomovel.ftAno.setText(null);
        cadAutomovel.tfCombustivel.setText(null);
        cadAutomovel.tfCor.setText(null);
        cadAutomovel.tfFabricante.setText(null);
        cadAutomovel.tfID.setText(null);
        cadAutomovel.tfModelo.setText(null);
    }

    private void salvar() {
        modelo.Automovel umAutomovel = new modelo.Automovel();
        umAutomovel.setAno(Integer.parseInt(cadAutomovel.ftAno.getText()));
        umAutomovel.setCombustivel(cadAutomovel.tfCombustivel.getText());
        umAutomovel.setCor(cadAutomovel.tfCor.getText());
        umAutomovel.setFabricante(cadAutomovel.tfFabricante.getText());
        umAutomovel.setId(Integer.parseInt(cadAutomovel.tfID.getText()));
        umAutomovel.setModelo(cadAutomovel.tfModelo.getText());
        umAutomovel.setUmMotorista((modelo.Motorista) cadAutomovel.cbMotorista.getSelectedItem());
        if (cadAutomovel.tfID.getForeground().equals(Color.black)) {
            if (umAutomovel.getUmMotorista() == null) {
                JOptionPane.showMessageDialog(cadAutomovel, "Selecione um motorista!");
                cadAutomovel.cbMotorista.requestFocus();
            } else {
                if (daoAutomovel.inserir(umAutomovel)) {
                    JOptionPane.showMessageDialog(cadAutomovel, "Salvo!");
                } else {
                    JOptionPane.showMessageDialog(cadAutomovel, "Não foi possível salvar",
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
                limparTela();
            }
        } else {
            JOptionPane.showMessageDialog(cadAutomovel, "O campo 'ID' é inválido!");
            cadAutomovel.tfID.requestFocus();
        }
    }
}
